package Array;
//长度最小的子数组
public class minimum_size_subarray_sum {
    public static void main(String[] args) {
        minSubArrayLen(4,new int[]{1,4,4});
    }
    /*题目介绍：
    输入：target = 7, nums = [2,3,1,2,4,3]
    输出：2
    解释：子数组 [4,3] 是该条件下的长度最小的子数组。
     */

    /**
     *思路过程
     * 1.是一个滑动窗口的问题
     * 2.题目要求：1.区间总和大于等于 target ，且要长度最小
     * 3.定义两个指针 一个前一个后
     * 移动逻辑：快指针在前，慢指针在后，此时记录两个的和，如果小于target，则记录区间长度，然后快指针移动，后移，并且sum加上新的数,并
     *          如果大于等于target，则慢指针移动，sum减去所在数
     *          记录：1.定义一个变量记录区间和sum
     *              2.利用所在索引，去得到变化的区间大小，将较小的，记录下来
     */
    /**
     *错误记录
     * 1.刚开始是if，导致不能得到区间的最小，改成while就好了
     * 也就是滑动窗口的题目应该是for/while嵌套while 嵌套的while的目的是：不断达到符合的区间最小，不然是找不到最小的
     * 2.顺序出现问题：while 循环不能
     */
    public static int minSubArrayLen(int target, int[] nums) {
        int left=0;
        int right=0;
        int sum=0;
        int minLen=Integer.MAX_VALUE;
        while (right<nums.length){
            //增大窗口
             sum=sum+nums[right];
            //这里是if：导致不能达到区间的最小，要改成while
            while (sum>=target){
                //缩小窗口
                minLen=Math.min(minLen,right-left+1);
                //及时缩小窗口的值
                sum=sum-nums[left];
                left++;
            }
            //移动指针
            right++;
        }
    return minLen==Integer.MAX_VALUE?0:minLen;
    }
}
